// 1.1顺序表静态分配初始化
// #include <stdio.h>
// #define MaxSize 10  // 定义顺序表最大长度

// typedef struct {
//     int data[MaxSize];  // 存储数据的静态数组
//     int length;         // 当前顺序表长度
// } SqList;  // 顺序表类型定义

// // 初始化顺序表
// void InitList(SqList *L) {
//     for (int i = 0; i < MaxSize; i++) {
//         L->data[i] = 0;  // 数据元素初始化为 0
//     }
//     L->length = 0;       // 初始长度为 0
// }

// int main() {
//     SqList L;           // 声明顺序表变量
//     InitList(&L);       // 调用初始化函数
//     return 0;           // 程序正常结束
// }

// 1.2顺序表动态分配初始化
#include <stdio.h>
#include <stdlib.h>

#define InitSize 3  // 默认初始长度
#define INCREMENT 5  // 扩容增量

typedef struct {
    int *data;       // 动态数组指针
    int MaxSize;     // 当前最大容量
    int length;      // 当前实际长度
} SeqList;

// 初始化顺序表
void InitList(SeqList *L) {
    L->data = (int *)malloc(InitSize * sizeof(int));
    if (!L->data) {
        printf("Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    L->length = 0;
    L->MaxSize = InitSize;
}

// 扩容函数
void IncreaseSize(SeqList *L, int len) {
    int *p = L->data;  // 保存旧地址
    L->data = (int *)realloc(p, (L->MaxSize + len) * sizeof(int));
    if (!L->data) {
        printf("Memory reallocation failed!\n");
        exit(EXIT_FAILURE);
    }
    L->MaxSize += len;
}

// 插入元素函数
int ListInsert(SeqList *L, int pos, int value) {
    // 检查位置合法性
    if (pos < 1 || pos > L->length + 1) {
        printf("Insert position error! Valid range: [1, %d]\n", L->length + 1);
        return 0;
    }

    // 检查是否需要扩容
    if (L->length >= L->MaxSize) {
        IncreaseSize(L, INCREMENT);
    }

    // 元素后移
    for (int i = L->length; i >= pos; i--) {
        L->data[i] = L->data[i - 1];
    }

    // 插入元素
    L->data[pos - 1] = value;
    L->length++;
    return 1;
}

// 打印顺序表
void PrintList(SeqList *L) {
    printf("Current list (%d/%d): ", L->length, L->MaxSize);
    for (int i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    printf("\n");
}
//按位查找
int GetElem(SeqList *L, int i){
    printf("按位查找第(%d)位的值为（%d）: ", i,L->data[i-1]);
return L->data[i-1];
}
//在顺序表L中查找第一个元素值等于e的元素，并返回其位序
int LocateElem(SeqList *L,int e){
for(int i=0;i<L->length;i++)
if(L->data[i]==e){
printf("按值查找值为(%d),的位序为（%d）: ", e,i+1);
return
i+1;}
//数组下标为i的元素值等于e，返回其位序i+1
return
0;
//退出循环，说明查找失败
}

int main() {
    SeqList L;
    InitList(&L);

    // 插入测试数据
    ListInsert(&L, 1, 10);  // 插入第一个元素
    ListInsert(&L, 2, 20);  // 插入第二个元素
    ListInsert(&L, 1, 5);   // 插入到最前面
    ListInsert(&L, 4, 30);  // 插入到最后
    ListInsert(&L, 3, 25);  // 插入到中间

    PrintList(&L);  // 输出结果
    //按位查找返回值
     GetElem(&L,2);//输出按位查找结果
    //按值查找返回位
    LocateElem(&L,10);
    // 清理内存
    free(L.data);
    return 0;
}